package com.hejia.alauda.service;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;

import org.springframework.ui.Model;

import com.alibaba.fastjson.JSONObject;
import com.hejia.alauda.entity.Address;
import com.hejia.alauda.entity.Award;
import com.hejia.alauda.entity.Financing;
import com.hejia.alauda.entity.Qualification;
import com.hejia.alauda.entity.ThirdOrder;
import com.hejia.alauda.entity.Traffic;
import com.hejia.alauda.entity.User;
import com.hejia.alauda.entity.example.QualificationExample;
import com.hejia.alauda.mongodb.KeyValue;

public interface ActivityService {
	
	static final Object LOCK = new Object();
	
	/**
	 * 分享有礼	欢乐合家加油站 致月底流量不够的你2015年3月28日~3月31日 的抽奖逻辑代码
	 * @return
	 */
	Award luckydrawForMarchTraffic2015(User user, boolean devMode);
	
	/**
     * 查询符合2015年三月送流量的活动资格的用户名单
     * @return
     */
	boolean monitorTotalAmountForMarchTraffic2015();
	
	/**
	 * 判断用户是否有参与流量活动资格
	 * @param user 用户对象
	 * @param model SPRING MVC model
	 * @param devMode 开发模式
	 * 
	 * @return 处理结果
	 */
	@Deprecated
	String findTrafficQualification(User user,Model model,boolean devMode);
	
	/**
	 * 流量活动抽奖
	 * @param user 用户对象
	 * 
	 * @return Traffic
	 */
	Traffic traffic(User user);

	/**
     * 查询2015年4月送流量的活动中奖用户名单
     * @param type 流量活动类型
     * @param used 中奖情况
     * @param today 当天中奖者 
     * @return 中奖用户信息（mobile 和  奖品信息）
     */
	List<Map<String,String>> trafficWinners(String type, boolean used,boolean today);

	/**
	 * 活动抽奖
	 * @param user 用户对象
	 * @param activityName 活动名称
	 * @param activityType 活动类型
	 * @return String 奖品对应的编码
	 */
	String lotteryDraw(User user,String activityName, String activityType);
	
	/**
	 * 活动抽奖用户记录
	 * @param user 用户对象
	 * @param activityName 活动名称
	 * @param activityType 活动类型
	 * @param awardCode 活动奖品编号
	 * @param used 奖品是否已领取
	 * 
	 * @return String 奖品对应的编码
	 */
	void sweepstakesRecord(User user,String activityName, String activityType, String awardCode ,Boolean used);
	
	/**
	 * 活动用户资格判断(活动期间总数量判断)
	 * @param user 用户对象
	 * @param activityName 活动名称
	 * @param devMode 是否为开发模式
	 * 
	 * @return boolean 
	 */
	boolean activityAmountCheck(User user, String activityName, Boolean devMode);
	
	/**
	 * 活动用户资格判断(活动期间单笔数量判断)
	 * @param user 用户对象
	 * @param activityName 活动名称
	 * @param devMode 是否为开发模式
	 * 
	 * @return boolean 
	 */
	boolean activitySingleCheck(User user, String activityName);
	
	/**
	 * 活动奖品领取截止日期判断
	 * @param activityName 活动名称
	 * 
	 * @return boolean 
	 */
	boolean awardExpiryDate(String activityName);
	
	/**
	 * 活动奖品领取截止日期判断
	 * @param activityName 活动名称
	 * @param start 开始时间
	 * 
	 * @return boolean 
	 */
	boolean awardExpiryDate(String activityName, Date start);
	
	/**
	 * 51用户活动抽奖记录标签前缀获取（零时）
	 * @param activityName 活动名称
	 * 
	 * @return boolean 
	 */
	@Deprecated
	public String activityFlagBy51 (String activityName, Boolean devMode);

	/**
	 * 获取抽奖活动用户手机号码跟奖品名称 
	 * 
	 * */
	List<Map<String, String>> findQualifications(Map<String, Object> params);
	
	/**
	 * 计算沪深300的指数的额外收益
	 */
	void calculateHushen300Income();
	
	/**
	 * 获得单个用户最早的激活时间
	 * @param id
	 * @return
	 */
	String getMinHushen300AuthorizeTime(Long id);
	
	/**
	 * 获得2015年六一活动的配置（放在redis中，30秒过期）
	 * @return
	 */
	List<String> getChildrensDay2015Config();
	
	/**
	 * 获得2015年易车活动的配置（放在redis中，30秒过期）
	 * @return
	 */
	JSONObject getYiche2015Config();
	
	/**
	 * 判断易车活动是否过期
	 * @return
	 */
	boolean isYiche2015Expired();
	
	/**
	 * 是否是在易车活动内注册的
	 * @return
	 */
	boolean isRegisterInYiche2015(Date register);
	
	/**
	 * 根据条件查询获得奖品的数据记录数
	 * @param example
	 * @return
	 */
	int findQualificationCountByExample(QualificationExample example);
	
	List<KeyValue> findYoukuInvitionByUser(Long id, int limit);
	
	/**
	 * 领取佳缘第二期的奖品
	 * @param params
	 * @return
	 */
	int updateQualificationThroughJiayuan(Map<String, Object> params);
	
	/**
	 * 新增第三方订单
	 * @param entity
	 * @return
	 */
	int insertThirdOrder(ThirdOrder entity);
	
	/**
	 * 修改第三方订单
	 * @param entity
	 * @return
	 */
	int updateThirdOrder(ThirdOrder entity);
	
	/**
	 * 根据id查询单条第三方订单
	 * @param id
	 * @return
	 */
	ThirdOrder findOneThirdOrder(Long id);
	
	/**
	 * 计算用户在2015-七夕活动中的资产列表
	 * @return
	 */
	List<Financing> findMagpieFestivalFinancings(User user);
	
	/**
	 * 计算用户在2015-七夕活动中的总金额
	 * @return
	 */
	BigDecimal calculateMagpieFestivalTotalAmout(User user);
	
	/**
	 * 处理送青蟹的活动数据2015
	 */
	void dealCrab2015(Financing financing);
	
	/**
	 * 处理0元购的业务逻辑
	 * @param financing
	 */
	void dealZeroYuanBusiness(Financing financing);
	
	/**
	 * 处理世纪佳缘第五期的业务逻辑
	 * @param financing
	 */
	void dealJiayuanSeasonFiveBusiness(Financing financing);
	
	/**
	 * 查询活动的配置（利用缓存）
	 */
	JSONObject getActivityConfig(String key);
	
	/**
	 * 处理双11红包翻倍的业务逻辑
	 * @param financing
	 */
	void dealDoubleElevenBusiness(Financing financing);
	
	/**
	 * 处理百合的业务
	 * @param financing
	 */
	void handleBaiheBusiness(Financing financing);
	
	/**
	 * 处理百合的其他业务
	 * @param financing
	 */
	void handleBaiheOtherBusiness(Financing financing);
	
	/**
	 * 处理百合的其他业务
	 * @param financing
	 */
	void handleBaiheRegisterBusiness(User user);
	/**
	 * 查询团内的成员
	 * @return
	 */
	KeyValue findGroupBuyingMember(String track, User user, Long founder);
	
	/**
	 * 处理团购活动的回调处理
	 */
	void handleGroupBuyingBusiness(Financing financing);
	
	/**
	 * 处理抽奖的业务逻辑
	 * @param financing
	 */
	void handleHejiaLotteryBusiness(Financing financing);
	
	BigDecimal getFinancingStat(User user);
	
	Map<String, Integer> getInvitationStat(User user);
	
	Address getAddressByUser(User user);
	
	Boolean DBFAward2016(User user, String awardCode);
	
	Boolean findQualificationRecord(User user, String awardCode);
}
